DynamoDB の update_item() で、SET・REMOVE・ADD・DELETEを同時に実行する
できるんです。
2024.07.29
DynamoDBの項目を更新するとき、Attributeを同時に追加・更新・削除したくなることがあります。
「あれ? できるよね?」となったので、試してみました。
おすすめの方
- boto3でDynamoDBの追加や更新をしたい方
- DynamoDBのupdate_item() で、SET・REMOVE・ADD・DELETEを同時に実行したい方
事前準備:データをputする
DynamoDBに適当なデータを追加します。ADDとDELETE用にString Setがあります。
put.py
import boto3
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("boto3-test")
def main():
# 事前準備
put()
def put():
table.put_item(
Item={
"todoId": "1111",
"title": "Learn DynamoDB",
"completed": False,
"hello": "world",
"tags": {"aaa", "bbb", "ccc"},
"category": {"111", "222", "333"},
}
)
if __name__ == "__main__":
main()
スクリプトを実行します。
python put.py
DynamoDBにデータが追加されました。これで準備完了です。
update_item() で、SET・REMOVE・ADD・DELETEを同時に操作する
1度のupdate_item()で、SET・REMOVE・ADD・DELETEを同時に実行します。
- SET
- titleとcompletedを更新
- noteを追加
- REMOVE
- helloを削除
- ADD
- tagsに値を追加
- DELETE
- categoryから値を削除
操作 | Attribute | Before | After |
---|---|---|---|
SET | title | Learn DynamoDB | Learn Lambda |
SET | completed | false | true |
SET | note | (無い) | This is a note |
REMOVE | hello | world | (無い) |
ADD | tags | {"aaa","bbb","ccc"} | {"aaa","bbb","ccc","zzz"} |
DELETE | category | {"111","222", "333"} | {"111","333"} |
これは、「UpdateExpression」に複数記入することで実現できました。同じAttributeに対する同時操作はできないので、それぞれ異なるAttributeを操作しています。
update.py
import boto3
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("boto3-test")
def main():
update()
def update():
table.update_item(
Key={"todoId": "1111"},
UpdateExpression="SET #title = :title, #completed = :completed, #note = :note REMOVE #hello ADD #tags :tags DELETE #category :category",
ExpressionAttributeNames={
"#title": "title",
"#completed": "completed",
"#note": "note",
"#hello": "hello",
"#tags": "tags",
"#category": "category",
},
ExpressionAttributeValues={
":title": "Learn Lambda",
":completed": True,
":note": "This is a note",
":tags": {"zzz"},
":category": {"222"},
},
)
if __name__ == "__main__":
main()
スクリプトを実行します。
python update.py
期待通りに更新されました!
さいごに
DynamoDBの項目を更新するとき、Attributeを同時に追加・更新・削除してみました。参考になれば幸いです。